package com.study.spmongodb.book.wwj.char12;

import java.util.concurrent.TimeUnit;

/**
 * @author MI
 * @version 1.0
 * @date 2020/11/26 21:46
 */
public class VolatileFoo {
    //init_value的最大值
    final static int MAX = 5;

    //init_value的初始值
    static volatile int int_value = 0;

    public static void main(String[] args) {
        //启动一个reader线程，当发现local_value和init_value不同时，则输出init_value被修改的信息
        new Thread(() -> {
            int localValue = int_value;
            while (localValue < MAX) {
                if (int_value != localValue) {
                    System.out.printf("the init_value is updated to  [%d]\n", int_value);
                    localValue = int_value;
                }
            }
        }, "Reader").start();
        //启动update线程，主要用于对init_value的修改，当local_value>=5的时候则退出生命周期
        new Thread(() -> {
            int localValue = int_value;
            while (localValue < MAX) {
                //修改init_value
                System.out.printf("The init_value will be changed to [%d]\n", ++localValue);
                int_value = localValue;
                try {
                    //短暂的休眠，目的是为了使Reader线程能够来得及输出变化内容
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Updater").start();

    }
}
